package cn.demoncat.util.word;

import cn.demoncat.util.exception.IoRuntimeException;
import fr.opensagres.poi.xwpf.converter.pdf.PdfConverter;
import fr.opensagres.poi.xwpf.converter.pdf.PdfOptions;
import fr.opensagres.poi.xwpf.converter.xhtml.Base64EmbedImgManager;
import fr.opensagres.poi.xwpf.converter.xhtml.XHTMLConverter;
import fr.opensagres.poi.xwpf.converter.xhtml.XHTMLOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * Word转换工具
 *
 * @see <a href="https://github.com/opensagres/xdocreport">xdocreport</a>
 *
 * @author 延晓磊
 *
 * @since 2020年6月3日
 */
public class WordConvertUtil {

    /**
     * XHTML选项：以Base64格式化图片
     */
    private static final XHTMLOptions XHTML_BASE64 = XHTMLOptions.create().setImageManager(new Base64EmbedImgManager());


    /**
     * 读取word，输出为Html
     *
     * @param word	Word文档，必须是Word2007-docx
     * @param out	输出流：.html
     *
     * @author 延晓磊
     *
     * @since 2019年9月20日
     */
    public static void toHtml(InputStream word, OutputStream out) {
        try {
            // 读取Word文件
            XWPFDocument wd = new XWPFDocument(word);
            // 输出
            XHTMLConverter.getInstance().convert(wd, out, XHTML_BASE64);
        } catch (IOException e) {
            throw new IoRuntimeException("读取Word并输出Html失败", e);
        }
    }

    /**
     * 读取word，输出为PDF
     *
     * 注：PDF字体较粗，可能出现重叠
     *
     * @param word	Word文档，必须是Word2007-docx
     * @param out	输出流：.pdf
     *
     * @author 延晓磊
     *
     * @since 2019年9月20日
     */
    public static void toPdf(InputStream word, OutputStream out) {
        try {
            // 读取Word文件
            XWPFDocument wd = new XWPFDocument(word);
            // 输出
            PdfConverter.getInstance().convert(wd, out, PdfOptions.getDefault());
        } catch (IOException e) {
            throw new IoRuntimeException("读取Word并输出PDF失败", e);
        }
    }
}
